/**
 * created by 赵文韬 on 2022/5/16 19:00
 */
public class Demo01 {
    public static void main(String[] args) {
        //循环的方式初始化链表
        Node top = new Node();
        Node p = top;
        for (int i = 1; i < 10; i++) {
            //给value赋值
            p.value=i;
            if (i<9){
                p.next = new Node<>();
                p=p.next;
            }


        }
        //在2和3之间插入一个新的节点
        p=top;
        p=p.next;//p现在指向2节点
        Node<Object> tem = new Node<>();
        tem.value=100;
        tem.next=p.next;
        p.next=tem;//插入完毕
        //打印链表
        p=top;//先让p回到起点
        for (;;) {
            if (p!=null){
                System.out.print(p.value+" ");
                p=p.next;
            }else {
                break;
            }
        }
        System.out.println();

        System.out.println("=================");
        //删除链表
        p=top;
        p=p.next;//p现在指向2这个节点
        p.next=p.next.next;
        tem.next=null;
        //打印链表
        p=top;
        for (;;) {
            if (p!=null){
                System.out.print(p.value+" ");
                p=p.next;
            }else {
                break;
            }
        }
        //写一个环形链表
        /*p=top;
        for (;;) {
            if (p.next==null){
                break;
            }else {
                p=p.next;
            }
        }
        //p现在指向最后一个节点
        p.next=top.next.next.next;*/
        //打印
     /*   p=top;
        System.out.println("****************");
        for (int i = 0; i < 50; i++) {
            if (p!=null){
                System.out.print(p.value + " ");
               p = p.next;
            }else {
                break;
            }
        }
        //top这个链表现在是一个环形链表
        //用快慢指针的方式判断链表是否带环
        if (f1(top)) {
            System.out.println("是一个环形链表");
        }else System.out.println("不是环形链表");*/


        Node f2 = f2(top);
        p=f2;
        System.out.println("****************");
        for (int i = 0; i < 50; i++) {
            if (p!=null){
                System.out.print(p.value + " ");
                p = p.next;
            }else {
                break;
            }
        }


    }

    //判断链表是不是一个环形链表
    public static Boolean f1(Node top){
        Node p1 = top;//满指针
        Node p2 = top;//快指针
        for (int i=0;;i++) {
            if (p2==null&&p2.next==null){
                return false;
            }
            if (p1==p2 && i!=0){//如果两个指针不是在起点处相遇，那么该链表是一个环形链表
                return true;
            }
            p1=p1.next;
            p2=p2.next.next;
        }
    }
    //把链表逆序
    public static Node f2(Node top){
        if (top.next==null){
            return top;
        }
        Node p1 = top;
        Node p2 = top.next;
        Node p3 = top.next.next;
        p1.next=null;
        for (;;) {
          if (p3==null){
              p2.next=p1;
              return p2;
          } else {
              p2.next=p1;
              //三个指针整体后移
              p1=p2;
              p2=p3;
              p3=p3.next;
          }
        }
    }
    //定义单向链表
    public static class Node<T>{
        T value;
        Node<T> next;
    }


}
